#include "FronteiraRigida.h"


FronteiraRigida::FronteiraRigida(MODEL*md)
{
    pModel=md;
    BoxMinH=pModel->BoxMin[0];
    BoxMinV=pModel->BoxMin[1];
    BoxMaxH=pModel->BoxMax[0];
    BoxMaxV=pModel->BoxMax[1];
}
FronteiraRigidaParalelo::FronteiraRigidaParalelo(MODEL*md)
{
    pModel=md;
    BoxMinH=pModel->BoxMin[0];
    BoxMinV=pModel->BoxMin[1];
    BoxMaxH=pModel->BoxMax[0];
    BoxMaxV=pModel->BoxMax[1];
}


void FronteiraRigida::calcular()
{
    #pragma omp single
    {
        for (SPHERE* s = pModel->SPHList.Begin; s != NULL;s = s->Next)
        {
            if (s->R[0] < BoxMinH + s->Rad && s->V[0] < 0.0) { s->R[0] = BoxMinH + s->Rad; s->V[0] = -s->V[0]; }
            if (s->R[1] < BoxMinV + s->Rad && s->V[1] < 0.0) { s->R[1] = BoxMinV + s->Rad; s->V[1] = -s->V[1]; }
            if (s->R[0] > BoxMaxH - s->Rad && s->V[0] > 0.0) { s->R[0] = BoxMaxH - s->Rad; s->V[0] = -s->V[0]; }
            if (s->R[1] > BoxMaxV- s->Rad && s->V[1] > 0.0) { s->R[1] = BoxMaxV - s->Rad; s->V[1] = -s->V[1]; }
        }
    }
    //barreira implícita
}

void FronteiraRigidaParalelo::calcular()
{
    #pragma omp for schedule (static,1)
    for (int i = 0; i < pModel->numProceEsf; i++)
    {
        SPHERE* testeFim;
        if (i!=pModel->numProceEsf-1) testeFim = pModel->threads[i+1];
        else testeFim=NULL;
        for (SPHERE* s = pModel->threads[i]; s != testeFim; s = s->Next)
        {

            REAL R0;
            REAL R1;
            R0 = s->R[0];
            R1 = s->R[1];
            REAL V0;
            REAL V1;
            V0 = s->V[0];
            V1 = s->V[1];
            REAL Rad;
            Rad = s->Rad;

            if (R0 < BoxMinH + Rad && V0 < 0.0)
            {
                R0 = BoxMinH + Rad;
                V0 = -V0;
            }
            else if (R0 > BoxMaxH - Rad && V0 > 0.0)
            {
                R0 = BoxMaxH - Rad;
                V0 = -V0;
            }
            if (R1 < BoxMinV + Rad && V1 < 0.0)
            {
                R1 = BoxMinV + Rad;
                V1 = -V1;
            }
            else if (R1 > BoxMaxV - Rad && V1 > 0.0)
            {
                R1 = BoxMaxV - Rad;
                V1 = -V1;
            }
            s->R[0] = R0;
            s->R[1] = R1;
            s->V[0] = V0;
            s->V[1] = V1;
        }
    }
    //Barreira implicita
}
